Design System
AquaX — Current UI Design Baseline
| Document Info | |
|---|---|
| Version | 1.0 |
| Status | Draft — Current Implementation Baseline |
| Created Date | 2026-09-17 |
| Last Updated | 2026-09-17 |
| Owner | Product Design & Frontend |
| Reviewers | Web, Mobile, Product, QA |
| Source Code Reviewed | web/src/assets/styles/*, web/src/main.tsx, web/src/core/components/*, web/src/core/constants/user-management-styles.ts, mobile/src/core/theme/*, mobile/src/core/components/*, mobile/src/core/navigation/*, representative web/mobile feature screens |
Implementation alignment note: This document describes the design system currently used in code. It is not a future visual redesign. Where web and mobile differ, the difference is called out explicitly so future cleanup can standardize tokens without breaking current UI.
Table of Contents
- Purpose And Scope
- Current Technology Stack
- Design Principles In Current Code
- Brand And Visual Identity
- Color System
- Typography
- Spacing, Radius, Shadow And Motion
- Layout System
- Components
- Navigation Patterns
- Status, Severity And Role Visuals
- Forms And Inputs
- Data Display
- Feedback, Loading And Empty States
- Icons And Assets
- Responsive And Mobile Behavior
- Accessibility Baseline
- Implementation Guidelines
- Current Design Debt
- Traceability
- Document History
1. Purpose And Scope
This document defines the UI design baseline for AquaX based on the current web and mobile codebase.
It covers:
- design tokens currently present in web and mobile;
- common colors, typography, spacing, radius, shadow and motion;
- shared component patterns used by the web dashboard and mobile app;
- role navigation and information architecture patterns;
- status/severity/role visuals;
- known inconsistencies that should be fixed in future design-system cleanup.
It does not introduce new product requirements. Feature scope remains governed by PRD, BRD, SRS, Product Backlog and Permission Matrix.
2. Current Technology Stack
| Surface | Stack | Design Approach |
|---|---|---|
| Web | React, Vite, Ant Design, Tailwind CSS utilities, lucide-react icons. | AntD components wrapped or styled with Tailwind utility classes and CSS variables. |
| Mobile | Expo React Native, React Navigation bottom tabs, Ant Design React Native, lucide-react-native icons. | StyleSheet.create per screen/component, with a small core/theme provider and many hardcoded screen-level tokens. |
| Shared Brand | AquaX logo asset. | Used in web sidebar brand and mobile header/loading screen. |
Primary files:
| Area | File |
|---|---|
| Web CSS variables | web/src/assets/styles/variables.css |
| Web global CSS/motion | web/src/assets/styles/tailwind.css, web/src/main.scss |
| Web AntD provider | web/src/main.tsx |
| Web reusable layout/table/stats | web/src/core/components/AppShell/*, AquaTable, StatsGrid |
| Web form constants | web/src/core/constants/user-management-styles.ts |
| Mobile theme provider | mobile/src/core/theme/theme.tsx |
| Mobile theme tokens | mobile/src/core/theme/colors.ts, spacing.ts, typography.ts, layout.ts |
| Mobile reusable shell | mobile/src/core/navigation/shared/RoleTabNavigator.tsx |
| Mobile reusable components | mobile/src/core/components/AppButton.tsx, Screen.tsx, AppToast.tsx, AppProviders.tsx |
3. Design Principles In Current Code
| Principle | Current Expression |
|---|---|
| Operational clarity | Dashboards prioritize tables, cards, filters, alert/status badges and scoped operational data. |
| Calm enterprise UI | Web uses white cards, muted green-tinted backgrounds, teal primary actions and low-shadow surfaces. |
| Field usability | Mobile uses large cards, bottom tabs, bold labels, high-contrast status colors and pull-to-refresh patterns. |
| Role-specific navigation | Web sidebar and mobile bottom tabs expose screens by role. |
| Status-first scanning | Health, severity, role and active/inactive states use color badges/pills with short labels. |
| Implementation-first consistency | Reusable wrappers exist, but many screens still define local styles; this doc records actual usage. |
4. Brand And Visual Identity
| Token / Asset | Current Usage |
|---|---|
| Product name | AquaX appears in web sidebar and mobile app header/login/loading surfaces. |
| Logo | Web uses AquaXLogo; mobile uses assets/brand/aquax-logo.png and BrandLogo. |
| Brand feel | Aquaculture/operations: teal/green primary, white cards, muted slate text, orange/danger status accents. |
Brand surfaces:
- Web sidebar brand: logo
44px, titleAquaX, subtitleHệ thống quản trị. - Mobile app header: dark teal header
#005D4E, logo container36x36, brand text20px / 700. - Mobile launch loading: large logo
132px, white circular logo surface, green pulse/progress treatment.
5. Color System
5.1 Web Canonical CSS Variables
Web currently has the clearest token layer in variables.css.
| Token | Value | Usage |
|---|---|---|
--aquax-color-primary |
#006b5f |
Main web brand/action color. |
--aquax-color-primary-container |
#008378 |
Accent/container and chart color. |
--aquax-color-secondary |
#006a63 |
Secondary teal. |
--aquax-color-tertiary |
#924628 |
Warning/brown-orange accent. |
--aquax-color-surface |
#f5faf8 |
Muted page/table/filter background. |
--aquax-color-background |
#fff |
Default white background/card. |
--aquax-color-danger |
#b00000 |
Web danger state. |
--aquax-color-danger-container |
#f6dada |
Danger badge background. |
--aquax-color-text-primary |
#111827 |
Main text. |
--aquax-color-text-secondary |
#4b5563 |
Secondary text. |
--aquax-color-border-subtle |
#dde7e3 |
Subtle borders. |
Web also aliases these into Tailwind-friendly variables such as --primary, --muted, --border, --foreground, --destructive and --radius.
5.2 Mobile Theme Tokens
Mobile has a core/theme provider:
| Token | Light | Dark | Note |
|---|---|---|---|
primary |
#1769E0 |
#1D7AFC |
Currently blue and not fully aligned with most AquaX mobile screens. |
background |
#F7F9FC |
#08111F |
Used by Screen. |
surface/card |
#FFFFFF |
#0D1728 / #111C2E |
Used by Ant Design React Native provider and reusable components. |
text |
#101828 |
#F4F7FB |
Main theme text. |
muted |
#667085 |
#9AA7B8 |
Secondary text. |
danger |
#D92D20 |
#FF6B6B |
Error/danger. |
success |
#039855 |
#2DBE7E |
Success. |
warning |
#DC6803 |
#F5A524 |
Warning. |
Current gap: Most production mobile screens use hardcoded Aqua/teal values such as #00796B, #006B5F, #007C6D, #005D4E, while core/theme.primary remains blue. Future cleanup should align core/theme to the AquaX teal palette before increasing token usage.
5.3 Current Palette From Code Usage
The following colors appear frequently and should be treated as current practical palette:
| Role | Web | Mobile | Notes |
|---|---|---|---|
| Primary teal | #006B5F, #087A70, #00796F |
#00796B, #006B5F, #007C6D, #007565 |
Main brand/action color. |
| Dark teal/header | #006A63 |
#005D4E, #004C3F |
Mobile header/login hero. |
| Surface/muted | #F5FAF8, #F6FBF9, #F3FAF7 |
#F8FAFC, #F1F5F9, #EEF6F3 |
Page backgrounds, cards, empty/missing data boxes. |
| Border | #DDE7E3, #D7E6E1, #E5E7EB |
#E2E8F0, #E5E7EB, #DDE6EA |
Inputs, cards, tables. |
| Text strong | #111827 |
#0F172A, #101828, #1E293B |
Titles/body strong. |
| Text secondary | #4B5563, #6B7280 |
#64748B, #475569, #667085 |
Body/meta text. |
| Text muted | #9CA3AF |
#94A3B8, #99A1AF, #CBD5E1 |
Placeholder/disabled/meta. |
| Danger | #B00000, #EF4444, #D50000 |
#D60000, #C40000, #EF4444, #D92D20 |
Alerts, inactive, errors. |
| Warning | #924628, #D97706, #F59E0B |
#A44F2A, #B65C1E, #FF9500 |
Warning states, technician/stat tones. |
| Success | #006B5F, #10B981 |
#008C80, #039855, #00796B |
Good/online/active states. |
| Role accent | #8B5CF6, #3B82F6 |
#7C3AED, #1D4ED8, #C2410C |
Role badges/avatars. |
5.4 Status Color Guidance
| State | Text/Icon | Background | Current Usage |
|---|---|---|---|
| Good / online / active | #008C80 or #006B5F |
#DFF7F3, #E8F5F3, #E6F7F4 |
Pond health, active users, online devices. |
| Warning / attention | #A44F2A or #924628 |
#FFE9DE, #FEF3E8, #FFF7ED |
Pond warning, warning stats. |
| Danger / critical | #D60000 or #B00000 |
#FFE8E8, #F6DADA, #FEF2F2 |
Critical alerts, inactive, error. |
| Info / neutral | #475569, #64748B |
#F8FAFC, #F3F6FA |
Secondary metadata and neutral pills. |
6. Typography
6.1 Web Typography
| Token | Value |
|---|---|
| Font family | Inter, ui-sans-serif, system-ui, sans-serif |
| Base font size | 16px |
| Display | 48px |
| H1 | 32px |
| H2 | 24px |
| Body | 16px |
| Label | 12px |
| Heading line-height | 1.25 |
| Body line-height | 1.5 |
Common web usage:
- Page title:
26pxto28px, bold, slate-950. - Page subtitle:
16pxto18px, slate-600. - Table header:
12pxto13px, bold, uppercase/tracking-wide. - Card stat value:
30px, bold. - Form label:
14px, medium. - Input text:
16px.
6.2 Mobile Typography
Mobile theme exposes:
| Token | Value |
|---|---|
title |
28px / 34px / 700 |
body |
16px / 24px |
caption |
13px / 18px |
Common mobile screen usage:
| Element | Current Usage |
|---|---|
| Screen title | 22-28px, weight 800-900. |
| Card title | 16-18px, weight 800-900. |
| Body/meta | 13-15px, weight 500-700. |
| Pill/badge text | 11-13px, weight 800-900. |
| Tab label | 10-12px, weight 700-800. |
| Button text | 15-16px, weight 700-900. |
Guideline: Use font weights intentionally. Current mobile code often uses 900; use it for labels/status/title emphasis, not long body text.
7. Spacing, Radius, Shadow And Motion
7.1 Spacing
Mobile core spacing:
| Token | Value |
|---|---|
xs |
4 |
sm |
8 |
md |
12 |
lg |
16 |
xl |
24 |
xxl |
32 |
Web spacing mostly uses Tailwind utilities:
| Pattern | Current Usage |
|---|---|
| Page padding | px-4 py-5, sm:px-6, lg:px-5 lg:py-6, xl:px-6. |
| Card/grid gap | gap-4, gap-3, gap-2. |
| Table cells | px-4 py-4, xl:px-5 xl:py-5. |
| Form controls | 40px, 46px, 50px height depending context. |
Mobile layout constants:
| Token | Value |
|---|---|
SCREEN_HORIZONTAL_PADDING |
Dynamic: min 14, max 20, roughly 4.5vw. |
SCREEN_BOTTOM_PADDING |
32. |
7.2 Radius
Web variables:
| Token | Value |
|---|---|
--aquax-radius-sm |
6px |
--aquax-radius-md |
8px |
--aquax-radius-lg |
12px |
--aquax-radius-pill |
999px |
Current usage:
- Web cards/tables/buttons/forms commonly use
rounded-lg(8px). - Mobile cards vary from
8pxto16px. - Pills/badges use
999px. - Mobile launch/logo and avatars use larger circular radii.
7.3 Shadow
| Surface | Current Pattern |
|---|---|
| Web cards/tables | --aquax-shadow-card: 0 1px 2px #1118270f, 0 4px 12px #1118270a. |
| Web sidebar mobile top | 0_8px_24px rgba(15,23,42,0.05). |
| Mobile cards | shadowColor #0F172A, opacity 0.08-0.14, radius 7-14, elevation 2-6. |
| Mobile logo surface | shadowColor #1E6B45, radius 28, opacity 0.1. |
7.4 Motion
Web motion tokens:
| Token | Value |
|---|---|
--aquax-motion-fast |
140ms |
--aquax-motion-base |
200ms |
--aquax-motion-slow |
280ms |
--duration-exit |
150ms |
--duration-enter |
210ms |
--duration-move |
400ms |
Current web supports:
- page settle animation;
- notification popover animation;
- view-transition animations;
- reduced-motion override.
Mobile supports:
- launch loading progress loop (
1400ms); - logo pulse (
1100ms); - standard React Navigation transitions.
8. Layout System
8.1 Web Layout
Current web application shell:
| Element | Current Behavior |
|---|---|
| Root layout | Full-height AntD Layout, background --muted. |
| Sidebar desktop | Fixed left sidebar, 250px expanded (lg:w-62.5), 72px collapsed (lg:w-18). |
| Sidebar mobile | Sticky top bar with mobile menu and notification bell. |
| Content | Scrollable page area on desktop, max width max-w-420 when sidebar expanded. |
| Workspace mode | Sidebar forced compact; content may become full-height/no padding. |
Web page composition:
- Optional page header with title/subtitle/actions.
- Filter/control row.
- Stats grid or summary cards.
- Table/list/detail cards.
- Drawer/modal for contextual detail where needed.
8.2 Mobile Layout
Mobile shell:
| Element | Current Behavior |
|---|---|
| Root providers | Gesture handler, React Query, Safe Area, Theme Provider, AntD RN Provider, Toast. |
| Header | Role tab navigator header with dark teal background and brand. |
| Bottom tabs | Role-specific tabs with lucide icons and labels. |
| Screen content | Usually ScrollView, SCREEN_HORIZONTAL_PADDING, pull-to-refresh in data-heavy screens. |
| Hidden screens | Detail/create/edit routes registered inside tab navigators with hidden tab item. |
Mobile tab bar:
- Active color:
#00796B. - Inactive color:
#596274. - Compact mode when width
<390ortabs.length >= 5. - Height:
58/64px + safe-area bottom adjustment. - Active indicator: teal top line.
9. Components
9.1 Web Reusable Components
| Component | Source | Current Design |
|---|---|---|
AppShell |
web/src/core/components/AppShell |
Sidebar + content shell, role-filtered navigation, notification bell and user menu. |
AquaTable |
web/src/core/components/AquaTable |
AntD Table wrapped in borderless rounded card with skeleton rows and updating banner. |
StatsGrid |
web/src/core/components/StatsGrid |
Responsive stat cards, default/primary/warning/danger tones. |
DetailInfoRow |
web/src/core/components/DetailInfoRow |
Detail row display pattern. |
Web component conventions:
- Prefer AntD for Button, Card, Table, Form, Input, Select, Drawer, Modal, Tag, Alert, Skeleton, Empty.
- Use Tailwind utilities for layout, spacing and specific overrides.
- Use CSS variables for primary, border, muted and shadow when possible.
- Use
lucide-reacticons in navigation/action buttons.
9.2 Mobile Reusable Components
| Component | Source | Current Design |
|---|---|---|
AppProviders |
mobile/src/core/components/AppProviders.tsx |
App provider stack, AntD RN theme bridge, launch loading screen. |
Screen |
mobile/src/core/components/Screen.tsx |
Safe-area aware scroll/non-scroll screen wrapper. |
AppButton |
mobile/src/core/components/AppButton.tsx |
AntD RN Button wrapper with primary/secondary/ghost variants. |
AppToast |
mobile/src/core/components/AppToast.tsx |
Custom top toast cards for success/error/info. |
BrandLogo |
mobile/src/core/components/BrandLogo.tsx |
Logo rendering for mobile header/brand areas. |
RoleTabNavigator |
mobile/src/core/navigation/shared/RoleTabNavigator.tsx |
Shared role-based bottom tab shell and header. |
Mobile component conventions:
- Use
Pressablefor tappable custom cards/list rows. - Use
StyleSheet.createlocally for screen and component styling. - Use
lucide-react-nativefor icons. - Use
ActivityIndicator,RefreshControl, custom empty/error text and bottom sheets/modals for feedback.
10. Navigation Patterns
10.1 Web Navigation
Web uses APP_SHELL_NAV_ITEMS with role filters.
Current route groups:
| Role | Current Web Navigation |
|---|---|
OWNER |
Tổng quan giám sát. |
ADMIN |
Quản lý tài khoản, Nông trại, Ao nuôi, Thiết bị IoT, Báo cáo, Báo hỏng, Nhật ký hoạt động, Thông báo, Cài đặt. |
MANAGER / TECHNICIAN |
Not broadly exposed in current web shell. |
Navigation item design:
- Height
44px. - Rounded
8px. - Icon
20px. - Text
14px / 600. - Active background currently
bg-gray-300. - Hover background
slate-200.
10.2 Mobile Navigation
Mobile uses role-specific bottom tab configs:
| Role | Current Tabs |
|---|---|
ADMIN |
Người dùng, Trang trại, Ao nuôi, Cá nhân. |
OWNER |
Trang chủ, Trang trại, Trợ lý AI, Nhật ký, Cá nhân. |
TECHNICIAN |
Technician-specific home/incidents/notifications/profile flows. |
MANAGER |
Manager navigator exists, scope/features are limited. |
Guidelines:
- Keep tab labels short enough for compact mode.
- Use icons from
lucide-react-native. - Register create/detail/edit screens as hidden tabs when they belong inside the role flow.
- Notification bell in header is currently available for
OWNERandTECHNICIAN.
11. Status, Severity And Role Visuals
11.1 Health / Severity
Current mobile pond health colors:
| Health | Accent | Background | Text |
|---|---|---|---|
good |
#008C80 |
#DFF7F3 |
#00796B |
warning |
#A44F2A |
#FFE9DE |
#8F3E1D |
danger |
#D60000 |
#FFE8E8 |
#D60000 |
Ticket severity/status currently uses config-driven chips in mobile/src/core/constants/ticket-configs.ts and AntD tags/buttons on web.
Guidelines:
- Pair color with text/icon, not color alone.
- Use short Vietnamese labels:
Tốt,Cảnh báo,Nguy hiểm,Hoạt động,Vô hiệu hóa. - Critical/danger should use red text and a light red background; avoid muted-only critical indicators.
11.2 Role Visuals
Mobile admin user cards currently use:
| Role | Avatar / Badge Tone | Label |
|---|---|---|
ADMIN |
Purple | Admin |
MANAGER |
Orange | Quản lý |
TECHNICIAN |
Blue | Kỹ thuật viên |
OWNER |
Purple/lavender | Chủ hộ |
Web role labels:
| Role | Label |
|---|---|
ADMIN |
Admin |
MANAGER |
Quản lý |
TECHNICIAN |
Kỹ thuật viên |
OWNER |
Chủ hộ |
12. Forms And Inputs
12.1 Web Forms
Current web form patterns:
| Element | Current Style |
|---|---|
| Text inputs | Height 40px, background #f5faf8, border #dde7e3, radius 8px, text 16px. |
| Filter controls | Height 46px desktop/mobile, 50px large; background #f6fbf9, border #d7e6e1. |
| Select | AntD Select with custom selector height/radius/background overrides. |
| Labels | 14px, weight 500, line-height 20px. |
| Helper text | 12px, line-height 20px, color #4b5563. |
| Required mark | Red. |
Guidelines:
- Use existing constants from
user-management-styles.tsfor user-management forms. - Prefer AntD validation and error states.
- Keep input heights stable to prevent layout shift.
- Use Vietnamese labels and errors consistently.
12.2 Mobile Forms
Current mobile form patterns:
- Inputs usually have light background
#F8FAFCor white. - Border color often
#E2E8F0. - Radius usually
12-14px. - Placeholder/muted color
#94A3B8. - Error color
#D60000or#EF4444. - Submit buttons use teal background and white bold text.
Guidelines:
- Use large touch targets, ideally
44px+. - Preserve safe-area and keyboard behavior.
- Use bottom sheets/modals for action confirmation where current UX already does so.
13. Data Display
13.1 Web Tables
AquaTable is the preferred management table wrapper.
Current table style:
- Wrapped in AntD
Card. - Card radius
8px. - Borderless card with
--aquax-shadow-card. - Header background
--muted. - Header text
12-13px, bold, tracking-wide. - Cells
px-4 py-4, larger onxl. - Supports skeleton row loading to reduce layout jump.
- Supports small updating banner above table.
13.2 Web Cards And Stats
StatsGrid:
- Responsive grid:
md:grid-cols-2,xl:grid-cols-4. - Card radius
8px. - Value size
30px. - Tones: default/slate, primary/teal, warning/brown, danger/red.
13.3 Mobile Cards And Lists
Current card patterns:
| Pattern | Current Style |
|---|---|
| Pond cards | White background, radius 8px, left accent bar, shadow/elevation, health badge, metric grid. |
| User cards | White background, border #E5E7EB, radius 16px, avatar, badge, status row, chevron. |
| Problem/ticket cards | White cards with severity left border, status/severity pills and metadata rows. |
| Summary cards | White cards with bold value, muted labels and status badges. |
Guidelines:
- Cards should be tappable with
PressableandaccessibilityRole="button"where applicable. - Important status should appear near title/top row.
- Use
numberOfLinesand flexible rows to avoid overflow.
14. Feedback, Loading And Empty States
14.1 Loading
| Surface | Current Pattern |
|---|---|
| Web initial data tables | Skeleton rows through AquaTable. |
| Web page/section loading | AntD Spin, Skeleton, card loading state. |
| Mobile app launch | Animated logo/progress screen. |
| Mobile screen loading | ActivityIndicator with teal color, often centered. |
| Mobile refresh | RefreshControl with teal #007C6D / #00796B. |
14.2 Toasts And Messages
| Surface | Current Pattern |
|---|---|
| Web | AntD message.success/error, Alert, Modal. |
| Mobile | AppToast with custom success/error/info cards. |
Mobile toast tones:
| Tone | Background | Border | Icon |
|---|---|---|---|
| Success | #ECFDF3 |
#6CE9A6 |
Green circular icon. |
| Error | #FEF3F2 |
#FDA29B |
Red circular icon. |
| Info | #EFF6FF |
#93C5FD |
Blue circular icon. |
14.3 Empty / Error States
Current usage:
- Web uses AntD
Empty,Alert,Skeleton. - Mobile uses centered muted text, icon boxes and retry/back buttons.
- Error text is usually red; no-data text is slate/muted.
Guidelines:
- Empty state should state what is missing, not blame the user.
- Error state should include retry/back action when recoverable.
- Loading and updating states should preserve layout where possible.
15. Icons And Assets
| Surface | Icon Library | Usage |
|---|---|---|
| Web | lucide-react |
Sidebar, page actions, buttons, status/metadata. |
| Mobile | lucide-react-native |
Tabs, header bell, cards, status, form affordances. |
| Mobile AntD RN | @ant-design/icons-react-native fonts loaded in AppProviders. |
Required for AntD RN controls. |
Guidelines:
- Prefer lucide icons for action buttons and navigation.
- Icon size is commonly
18-24px; mobile header bell uses26px. - Pair unfamiliar icons with labels or tooltips where possible.
- Maintain stroke width around
2-2.4for mobile; web around1.9-2.2.
16. Responsive And Mobile Behavior
16.1 Web
Current responsive behavior:
- Sidebar becomes top mobile shell on small viewports.
- Desktop content uses sidebar offset and scrollable content area.
- Tables may use horizontal scrolling through AntD table scroll props where configured.
- Page headers stack vertically on small screens and align action buttons on larger screens.
Guidelines:
- Keep management UI dense but readable.
- Avoid fixed widths that break table/card content below
320px. - Use responsive Tailwind utilities for spacing and grid columns.
16.2 Mobile
Current mobile behavior:
- Safe-area aware header/tab/content.
- Compact bottom tab mode for narrow screens and 5-tab roles.
- Pull-to-refresh on key owner home/data screens.
- Font shrinking for tab labels via
adjustsFontSizeToFit.
Guidelines:
- Keep touch targets at least
44px. - Use one-handed field workflows where possible.
- Avoid long tab labels.
- Use hidden stack screens inside tab navigators for detail/create/edit flows.
17. Accessibility Baseline
Current code includes some accessibility primitives:
accessibilityRole="button"on mobile custom cards/buttons.aria-labelon compact web navigation/sidebar toggle.- Tooltips on compact web nav/toggle controls.
- Focus-visible styles on web sidebar controls.
- Reduced-motion media handling in web global styles.
Required improvements:
| Gap | Recommendation |
|---|---|
| Color-only status indicators | Pair with text/icon consistently. |
| Inconsistent mobile custom controls | Add accessibilityRole, labels and disabled state to all custom Pressable controls. |
| Tables/actions | Ensure icon-only actions have labels/tooltips. |
| Contrast review | Verify orange/warning and muted gray combinations against WCAG. |
| Motion | Keep reduced-motion fallbacks for new web animations. |
18. Implementation Guidelines
18.1 Web Guidelines
- Use AntD as base component system.
- Use
ConfigProvidertokens for primary color, radius and font. - Use
variables.csstokens for colors/radius/shadow. - Use Tailwind utilities for layout, spacing and one-off overrides.
- Use
AquaTablefor management tables. - Use
StatsGridfor standard stat summaries. - Use
AppShellnavigation patterns for authenticated pages. - Keep business logic out of reusable UI wrappers.
18.2 Mobile Guidelines
- Use
RoleTabNavigatorfor role tab shells. - Use
Screenfor new simple screens when applicable. - Use
AppToastfor top-level feedback. - Use
AppButtonwhen its current styling fits; otherwise document deviations. - Prefer extracting repeated colors/styles into
core/themeonly after aligning theme tokens with current AquaX teal palette. - Use
Pressablewith accessibility role for tappable custom cards.
18.3 Copy And Language
- Current UI is primarily Vietnamese.
- Use short operational labels:
Trang chủTrang trạiAo nuôiNhật kýCá nhânHoạt độngVô hiệu hóaCảnh báoNguy hiểm
- Keep button text command-oriented:
Tạo,Lưu,Cập nhật,Gán,Đóng,Quay lại.
19. Current Design Debt
| ID | Area | Issue | Impact | Recommendation |
|---|---|---|---|---|
| DS-DEBT-001 | Mobile theme | core/theme.primary is blue while most current mobile screens use Aqua teal. |
New components using theme may look off-brand. | Align mobile theme tokens to current AquaX teal palette. |
| DS-DEBT-002 | Token usage | Many mobile screens hardcode colors, typography, radius and shadows. | Hard to update visual system consistently. | Introduce mobile semantic tokens after palette alignment. |
| DS-DEBT-003 | Web token usage | Web mixes CSS variables, Tailwind slate classes and hardcoded hex values. | Slight inconsistencies in text/border/surface tone. | Gradually replace hardcoded common colors with variables. |
| DS-DEBT-004 | Radius consistency | Cards vary between 8, 12, 14, 16, 20+ px. |
UI rhythm varies by feature. | Define card/input/modal radius tiers and migrate incrementally. |
| DS-DEBT-005 | Role surfaces | Web has broad admin/owner shell, while manager/technician web patterns are limited. | Future role pages may improvise styling. | Define role-page templates before adding major new web role surfaces. |
| DS-DEBT-006 | AI UI | Mobile owner tab has AI support entry point, but production AI UI is not complete. | AI UI may diverge when implemented. | Define AI chat, confidence, source-reference and fallback components before MVP 3/4. |
| DS-DEBT-007 | Accessibility | Custom mobile cards/actions are not uniformly labeled. | Assistive tech quality varies. | Add accessibility checklist to mobile component DoD. |
20. Traceability
| Area | Source |
|---|---|
| Web design tokens | web/src/assets/styles/variables.css |
| Web global motion/base styles | web/src/assets/styles/tailwind.css, web/src/main.scss |
| Web AntD theme | web/src/main.tsx, web/src/core/config/app.config.ts |
| Web shell/navigation | web/src/core/components/AppShell/*, web/src/core/constants/app-shell.ts |
| Web table/stat components | web/src/core/components/AquaTable/index.tsx, web/src/core/components/StatsGrid/index.tsx |
| Web form styles | web/src/core/constants/user-management-styles.ts |
| Mobile theme | mobile/src/core/theme/* |
| Mobile providers/toast/button/screen | mobile/src/core/components/* |
| Mobile role navigation | mobile/src/core/navigation/* |
| Mobile owner cards/status | mobile/src/features/owner/home/*, mobile/src/features/owner/problems/* |
| Mobile admin role card | mobile/src/features/admin/users/components/AdminUserCard.tsx |
| Product scope | 01_PRD — Product Requirements Document.md, 06_User Stories — Product Backlog.md |
21. Document History
| Version | Date | Author | Changes |
|---|---|---|---|
| 1.0 | 2026-09-17 | Product Design & Frontend | Created current-code design system baseline for web and mobile. |
End of Design System